/*
 * Copyright (c) 2024. hallele, Inc All rights reserved.
 */

package cn.hallele.ms.usercenter.das;

import cn.hallele.infrastructure.metadata.io.Page;
import cn.hallele.infrastructure.util.ObjectUtil;
import cn.hallele.mc.sdk.usercenter.common.enums.DeptStatusEnum;
import cn.hallele.mc.sdk.usercenter.dto.DeptDTO;
import cn.hallele.mc.sdk.usercenter.dto.DeptQueryDTO;
import cn.hallele.ms.infrastructure.core.convertor.das.ModelDas;
import cn.hallele.ms.usercenter.application.action.dept.DeptApplicationService;
import cn.hallele.ms.usercenter.application.bo.DeptBO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

/**
 * hallele_ms_usercenter
 *
 * @author anle5
 * @since 2024/11/16 16:58
 */
@Slf4j
@Component
public class DeptDBDas extends ModelDas<DeptApplicationService, DeptDTO, DeptBO> {
    protected DeptDBDas(DeptApplicationService option) {
        super(option);
    }

    /**
     * 分页查询所有部门名
     *
     * @param condition 查询条件
     * @return 分页结果
     */
    public Page<DeptDTO> findAll(DeptQueryDTO condition) {
        return revertPage(this.option.findAll(condition.getPageNo(), condition.getPageSize(), convert(condition)));
    }

    /**
     * 查询单个部门信息
     *
     * @param condition 查询条件
     * @return 部门信息
     */
    public DeptDTO findOne(DeptQueryDTO condition) {
        return revert(this.option.findOne(convert(condition)));
    }

    /**
     * 新增 部门
     *
     * @param deptDTO 部门
     */
    public void addOne(DeptDTO deptDTO) {
        this.option.addOne(convert(deptDTO));
    }

    /**
     * 更新 部门
     *
     * @param deptDTO 部门
     */
    public void updateOne(DeptDTO deptDTO) {
        this.option.updateOne(convert(deptDTO));
    }

    /**
     * 删除 部门
     *
     * @param id 要删除的dept id
     */
    public void delete(Integer id) {
        this.option.delete(id);
    }

    /**
     * 更新 部门 状态
     *
     * @param id         主键
     * @param deptStatus 状态
     */
    public void updateDeptStatus(Integer id, DeptStatusEnum deptStatus) {
        this.option.updateDeptStatus(id, deptStatus);
    }


    /**
     * 将E回转陈T
     *
     * @param deptBO 被回转换者
     * @return S 回转换后者
     */
    @Override
    protected DeptDTO revert(DeptBO deptBO) {
        return ObjectUtil.transferBean(deptBO, DeptDTO.class);
    }

    /**
     * 将T转成E
     *
     * @param deptDTO 被转换者
     * @return S 转换后者
     */
    protected DeptBO convert(DeptQueryDTO deptDTO) {
        return ObjectUtil.map(deptDTO, d -> DeptBO.builder()
                .id(d.getId())
                .name(d.getName())
                .phone(d.getPhone())
                .status(d.getStatus())
                .build());
    }

    /**
     * 将T转成E
     *
     * @param deptDTO 被转换者
     * @return S 转换后者
     */
    @Override
    protected DeptBO convert(DeptDTO deptDTO) {
        return ObjectUtil.transferBean(deptDTO, DeptBO.class);
    }
}
